#include "globale.h" // Fonction et Headers globaux

#include "../games/cls_configuration.h" // Classe de gestion du fichier de configuration
#include "../multimedia/cls_mouse.h" // Classe des gestion du curseur de la souris
#include "../menu/cls_accueil.h" // Classe de gestion du menu principal
#include "../games/cls_game.h" // Classe des gestion du curseur de la souris

#ifdef WIN32
    #include <windows.h>
#else

#endif

int main(int argc, char *argv[])
{

    cls_Configuration::init();


// http://www.siteduzero.com/forum-83-90622-probl-me-d-ex-cution.html
// Si on est en mode release, on definit le repertoire courant,
// ce qui permet d'utiliser les chemins relatifs pour localiser une image
#ifndef DEBUG
    #ifdef WIN32
    char binaryPath[256];
    strcpy(binaryPath,argv[0]);
    char* lastSlash=strrchr(binaryPath,'\\');
    if(lastSlash){
        *lastSlash=0;
        SetCurrentDirectory(binaryPath);
        debugTrace("SetCurrentDirectory [OK]");
    }
    else
    {
        debugTrace("SetCurrentDirectory [ERREUR]");
    }
    #else
    chdir("/usr/share/games/les-aventures-de-max");

    #endif
#endif


    int n_CodeRetour;
    bool b_GameIsRunning=false;

    SDL_Surface * p_sdlS_Ecran = NULL;

    cls_Accueil accueilMenu;
    cls_Game gameEcranDeJeu;


    /* ------------------------------------------------------------------------------------------------- */

    debugTrace("Debut du Main");


    // Initialisation de la SDL
    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("Les aventures de MAX", NULL);
    TTF_Init();

    // Création de l'écran
    if (cls_Configuration::isFullScreen() == CONFIG_FULL_IS)
    {
        p_sdlS_Ecran = SDL_SetVideoMode(cls_Configuration::getWindowWidth(), cls_Configuration::getWindowHeight(), 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
    }
    else
    {
        p_sdlS_Ecran = SDL_SetVideoMode(cls_Configuration::getWindowWidth(), cls_Configuration::getWindowHeight(), 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    }

    // On efface le curseur de la souris
    cls_Mouse::set_CursorDisplay(false);

    // Initialisation des objets
    accueilMenu.Init(p_sdlS_Ecran);

    if (gameEcranDeJeu.Init(p_sdlS_Ecran) != RETOK)
    {
        debugTrace("!!! PROBLÈME INITIALISATION SCÉNARIO !!!");
        return EXIT_FAILURE;
    }

    // On lance le menu en attendant son code de retour
    n_CodeRetour = accueilMenu.Run(b_GameIsRunning);

    // Tand que le code de retour ne donne pas l'ordre de quitter
    while(n_CodeRetour != CST_RET_ACCUEIL_QUIT)
    {
        switch(n_CodeRetour)
        {
            // Si on demande de jouer
            case CST_RET_ACCUEIL_PLAY:
                b_GameIsRunning=true;
                // On lance le jeu, puis quand on quitte le jeux, on relance le menu
                gameEcranDeJeu.Run();
                n_CodeRetour = accueilMenu.Run(b_GameIsRunning);
                break;

            // Si on demande le menu option
            case CST_RET_ACCUEIL_OPTIONS:
                b_GameIsRunning=true;
                // On lance le menu option, puis quand on quitte le menu option, on relance le menu d'accueil
                //gameEcranDeJeu.Run();
                n_CodeRetour = accueilMenu.Run(b_GameIsRunning);
                break;

            // Si l'on demande l'echapement
            case CST_RET_ACCUEIL_ESC:
                // Si il y avait un jeu en cours, on y retourne
                if (b_GameIsRunning==true) gameEcranDeJeu.Run();
                // On reaffiche le menu
                n_CodeRetour = accueilMenu.Run(b_GameIsRunning);
                break;

        }
    }

    // Nettoyage
    accueilMenu.FreeSurface();
    gameEcranDeJeu.FreeSurface();


    SDL_FreeSurface(p_sdlS_Ecran);

    // Fermeture de la SDL
    TTF_Quit();
    SDL_Quit();

    debugTrace("Fin du Main");

    return EXIT_SUCCESS;

}
